package com.senac.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.senac.model.Usuario;
import com.senac.parser.Parser;
import com.senac.parser.UsuarioParser;


public class UsuarioDao {

	
	public List<Usuario> getUsuarios() {		
		Connection con =  null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Usuario> list = new ArrayList<Usuario>();
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT * FROM USUARIO");
			rs = ps.executeQuery();
			Parser<Usuario> uParser = new UsuarioParser(rs);
			while(rs.next()){
				list.add(uParser.parse());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}				
		return list;
	}

	public Usuario getUsuariosById(Integer id) {
		Connection con =  null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Usuario usuario = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT * FROM USUARIO WHERE ID = ?");
			ps.setInt(1, id);
			rs = ps.executeQuery();
			Parser<Usuario> uParser = new UsuarioParser(rs);
			if(rs.next()) {
				usuario = uParser.parse();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}				
		return usuario;
	}
	
	public boolean verifyLogin(String login, int id) {
		Connection con =  null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			con = ConnectionFactory.getConnection();
			String query = "SELECT * FROM USUARIO WHERE upper(LOGIN) = ? ";
			if(id > 0) {
				query += " AND ID != ?";
			}
			ps = con.prepareStatement(query);
			ps.setString(1, login.toUpperCase());
			if(id > 0) {
				ps.setInt(2, id);
			}
			rs = ps.executeQuery();
			if(rs.next()) {
				return false;				
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}				
	}

	public boolean save(Usuario usuario) {
		Connection con =  null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("INSERT INTO USUARIO (login, senha, nome, email) VALUES (?, ?, ?, ?)");			
			ps.setString(1, usuario.getLogin().toUpperCase());
			ps.setString(2, usuario.getSenha());
			ps.setString(3, usuario.getNome());
			ps.setString(4, usuario.getEmail());
			return ps.executeUpdate() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}
	}

	public boolean update(Usuario usuario) {
		Connection con =  null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("UPDATE USUARIO SET login = ?, senha = ?, nome = ?,email= ? WHERE ID = ?");			
			ps.setString(1, usuario.getLogin().toUpperCase());
			ps.setString(2, usuario.getSenha());
			ps.setString(3, usuario.getNome());
			ps.setString(4, usuario.getEmail());
			ps.setInt(5, usuario.getId());
			return ps.executeUpdate() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}	}

	public boolean delete(Integer id) {
		Connection con =  null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("DELETE FROM USUARIO WHERE ID = ?");			
			ps.setInt(1, id);
			return ps.executeUpdate() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}
	}
	
	public Usuario login(String login, String password) {
		Connection con =  null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Usuario usuario = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT * FROM USUARIO WHERE UPPER(LOGIN) = ? AND SENHA = ?");
			ps.setString(1, login.toUpperCase());
			ps.setString(2, password);
			rs = ps.executeQuery();
			Parser<Usuario> uParser = new UsuarioParser(rs);
			if(rs.next()) {
				usuario = uParser.parse();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}
		return usuario;
	}
	
}
